package be.khleuven.screencasting.facade;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author smokeit
 */
@Stateless
public class EntityFacade
        implements EntityFacadeRemote, EntityFacadeLocal
{
    @PersistenceContext
    private EntityManager em;

    @Override
    public Object create(Object entity)
    {
        em.persist(entity);
        return entity;
    }

    @Override
    public Object edit(Object entity)
    {
        return em.merge(entity);
    }

    @Override
    public void remove(Object entity)
    {
        em.remove(edit(entity));
    }

    @Override
    public Object find(Object id, Class clazz)
    {
        return em.find(clazz, id);
    }

    @Override
    public List select(String query)
    {
        Query q = em.createQuery(query);
        return q.getResultList();
    }

    /**
     * Deze methode moet je gebruiken als je query's met parameters wilt gebruiken
     * vb query 'select object(o) from entity where object = ?1'
     *
     * voor degene die het niet weten de 'Object ... naam' notatie is dezelfde als
     * je een param array zou schrijven in .Net (dus 'params Object[] naam')
     *
     *
     * Opgepast!!!
     * deze methode werkt niet als je Date of Calendar objecten gebruikt als parameters
     * (omdat je dan telkens de Temporaltype als argument zou moeten meegeven)
     *
     * @param query
     * @param params
     * @return
     */
    @Override
    public List select(String query, Object ... params)
    {
        Query q = em.createQuery(query);
        for(int i = 1; i <= params.length; i++)
        {
            q.setParameter(i, params[i - 1]);
        }
        return q.getResultList();
    }

    @Override
    public List findAll(Class clazz)
    {
        Query q = em.createQuery("select object(o) from " + clazz.getSimpleName() + " as o");
        return q.getResultList();
    }

    @Override
    public List findRange(Class clazz, int ... range)
    {
        Query q = em.createQuery("select object(o) from " + clazz.getSimpleName() + " as o");
        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }

    @Override
    public int count(Class clazz)
    {
        return ((Long) em.createQuery("select count(o) from "+ clazz.getSimpleName() + " as o").getSingleResult()).intValue();
    }
}
